#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <getopt.h>

void tp2_reverse(char s[])
 {
     int i, j;
     char c;
 
     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
 }


void tp2_itoa(int n, char s[])
 {
     int i, sign;
 
     if ((sign = n) < 0)  /* record sign */
         n = -n;          /* make n positive */
     i = 0;
     do {       /* generate digits in reverse order */
         s[i++] = n % 10 + '0';   /* get next digit */
     } while ((n /= 10) > 0);     /* delete it */
     if (sign < 0)
         s[i++] = '-';
     s[i] = '\0';
     tp2_reverse(s);
 }


void imprime_version () {
  printf ("tp2 - version: 1.0\n");
}

void imprime_uso () {
  printf ("tp2   Usage:\n\n"
	  "   tp2 [options]\n"
	  "   tp2 - Programa que analiza la caché de datos de la máquina donde se ejecuta.\n\n"
	  "   Options:\n"
	  "   		-v, --version      Imprime la versión.\n"
	  "   		-h, --help         Imprime esta ayuda.\n"
	  "   		-T, --tam         Setea el tamaño total de la cache a simular (funciona si sólo si también se usan -V y -B).\n"
	  "   		-V, --vias         Setea la cantidad de vías de la cache a simular (funciona si sólo si también se usan -T y -B).\n"
	  "   		-B, --bloque         Setea el tamaño de bloque de la cache a simular (funciona si sólo si también se usan -T y -V).\n");
}

int main (int argc, char *argv[]) {
  int c;
  int tam = 0, vias = 0, bloque = 0;
  int b_tam = 0, b_vias = 0, b_bloque = 0;

  char salida[50];
  char s_tam[10];
  char s_via[10];
  char s_blq[10];

  while (1) {
    static struct option long_options[] = {
      {"version", no_argument, 0, 'v'},
      {"help", no_argument, 0, 'h'},
      {"tam", required_argument, 0, 'T'},
      {"vias", required_argument, 0, 'V'},
      {"bloque", required_argument, 0, 'B'},
      {0, 0, 0, 0}
    };
    int option_index = 0;
    c = getopt_long (argc, argv, "vhT:V:B:", long_options, &option_index);

    if (c == -1)
      break;

    switch (c) {
    case 'v':
      imprime_version ();
      return 0;
      break;

    case 'h':
      imprime_uso ();
      return 0;
      break;

    case 'T':
      tam = atoi (optarg);
      b_tam = 1;
      break;

    case 'V':
      vias = atoi (optarg);
      b_vias = 1;
      break;

    case 'B':
      bloque = atoi (optarg);
      b_bloque = 1;
      break;

    case '?':
      fprintf (stderr, "Error en los parámetros\n");
      return -1;
      break;

    default:
      abort ();
    }
  }

  /* Se ejecuta el script que maneja los distintos módulos.*/
	
  system("chmod 755 modulos.sh");

  if( (b_bloque==1) && (b_vias==1) && (b_tam==1) )
  {     
      strcpy(salida,"./modulos.sh ");

      tp2_itoa(tam,s_tam);
      strcat(salida,s_tam);
      strcat(salida," ");
      tp2_itoa(vias,s_via);
      strcat(salida,s_via);
      strcat(salida," ");
      tp2_itoa(bloque,s_blq);
      strcat(salida,s_blq);
      strcat(salida," ");
    
      system(salida);
  }
  else
  {
    system("./modulos.sh");
  }

  return 0;
}
